package com.dfzt.myutils.common.sql;

import com.dfzt.myutils.common.file.TextFileUtil;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.regex.Pattern;

public class SqlUtil {
    /**
     * 判断sql文件类型（Mysql/Oracle）
     * @param sqlFilePath sql文件路径
     * @param fontRows 读取文件前几行
     * @return sql文件类型
     * TODO: 暂不可用
     */
    public static String judgeSqlType(String sqlFilePath, Integer fontRows){
        try (BufferedReader br = new BufferedReader(new FileReader(sqlFilePath))) {
            String line;
            int rowCount = 0;

            // TODO:正则表达式较粗糙，待完善，暂无法使用
            // 使用正则表达式检查Oracle特有的语法
            Pattern oraclePattern = Pattern.compile(
                    "\\b(all_tables|dual|connect\\s+by|sysdate|nvl|decode|insert\\s+all|forall)\\b"
            );

            // 使用正则表达式检查MySQL批量插入特有的语法
            Pattern mysqlPattern = Pattern.compile(
                    "insert\\s+into\\s+\\S+\\s+values\\s+\\([^)]+\\)+\\s*,\\s*\\([^)]+\\)"
            );

            while ((line = br.readLine()) != null && rowCount < fontRows) {
                String lowerLine = line.toLowerCase();
                if (oraclePattern.matcher(lowerLine).find()) {
                    return "oracle";
                }
                if (mysqlPattern.matcher(lowerLine).find()) {
                    return "mysql";
                }
                rowCount++;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 如果无法确定，返回一个默认值或者抛出异常
        return "unknown";
    }

    /**
     * 将MySQL的批量插入语句转换为Oracle的批量插入语句
     * @param sqlFilePath sql文件路径
     * @param outputFilePath 输出文件路径（默认为桌面）
     * @param oldInsertStr 旧插入语句头部
     * @param newInsertStr 新插入语句头部
     */
    public static void mysqlInsertSqlToOracleInsertSql(String sqlFilePath, String outputFilePath, String oldInsertStr, String newInsertStr) {
        // TODO:创建临时文件夹
        String tmpFolderPath = System.getProperty("user.home") + System.getProperty("file.separator") + "Desktop" + System.getProperty("file.separator") + "tmp";
        File folder = new File(tmpFolderPath);
        if(!folder.exists()){
            folder.mkdirs();
            System.out.println("已成功在桌面创建tmp临时文件夹！");
        }else {
            System.out.println("tmp临时文件夹已存在！");
        }

        // TODO: 第一次替换：替换插入语句开头部分字符串
        // 找到 "INSERT INTO" 的位置
        int insertIntoIndex = newInsertStr.indexOf("INSERT INTO");
        System.out.println("INSERT INTO的位置：" + insertIntoIndex);
        if (insertIntoIndex == -1) {
            throw new IllegalArgumentException("INSERT INTO not found in newInsertStr");
        }

        // 找到第一个空格的位置
        int spaceIndex = newInsertStr.indexOf(' ', insertIntoIndex + "INSERT INTO".length() + 1);
        System.out.println("第一个空格的位置：" + spaceIndex);
        if (spaceIndex == -1) {
            throw new IllegalArgumentException("No space found after INSERT INTO in newInsertStr");
        }

        // 提取表名
        String tableName = newInsertStr.substring(insertIntoIndex + "INSERT INTO".length() + 1, spaceIndex).trim();
        // 去掉表名周围的引号
        if (tableName.startsWith("\"") && tableName.endsWith("\"")) {
            tableName = tableName.substring(1, tableName.length() - 1);
        }
        String tempFilePath01 = tmpFolderPath + "\\" + "tmp_" + tableName + "_01.sql";
        TextFileUtil.replaceText(sqlFilePath, tempFilePath01, oldInsertStr, newInsertStr);

        // TODO: 第二次替换：单行批量插入替换为多行批量插入
        if (outputFilePath == "桌面" || outputFilePath == null){
            outputFilePath = System.getProperty("user.home") + System.getProperty("file.separator") + "Desktop" + System.getProperty("file.separator") + "\\" + tableName + ".sql";
        }
        TextFileUtil.replaceText(tempFilePath01, outputFilePath, "),", ");\n" + newInsertStr);

        // 清理中间文件
        TextFileUtil.deleteFile(tempFilePath01);
    }
}
